// 好友列表的Schema定义    
const mongoose = require("./mgdb.js");
const crypto = require('crypto');
const promisify = require("util").promisify;
const {
	DataRls
} = require("../config/class.js");
const {
	error
} = require("console");


// 单个好友的规则
const FriendList = new mongoose.Schema({
	friendId: { // 好友的用户ID  
		type: mongoose.Schema.Types.ObjectId,
		required: true,
	},
	username: { // 好友的用户名    
		type: String
	},
	remark: { // 好友备注    
		type: String,
		default: ""
	},
	addTime: { // 添加好友的时间    
		type: Date,
		default: Date.now
	}
});

// 好友列表的规则
const FriendSchema = new mongoose.Schema({
	ownerId: { // 好友列表拥有者的用户ID (主键)  
		type: mongoose.Schema.Types.ObjectId,
		required: true,
		unique: true // 确保ownerId的唯一性   
	},
	friends: [FriendList]
});



// 创建模型    
const Friend = mongoose.model('Friend', FriendSchema);



// 向已存在的好友列表中添加好友 
async function addToFriendList(ownerId, friendId, username) {
	try {
		// 尝试直接找到好友列表    
		let friendList = await Friend.findOne({
			ownerId
		});

		// 判断好友是否存在
		// 这个find方法，是js数组的方法
		let findFriend = friendList.friends.find((friend) => {
			if (friend.friendId == friendId) {
				return true;
			}
		})

		// 如果好友已经存在
		if (findFriend) {
			throw new DataRls(
				"好友已经存在",
				"无法重复添加好友",
				false,
			);
		} else {
			console.log("添加好友");
			console.log(friendId);
			// 判断好友列表是否存在
			if (!friendList) {
				// 如果好友列表不存在，则创建它并添加新好友    
				friendList = new Friend({
					ownerId: ownerId,
					friends: [{
						friendId: friendId,
						username: username
					}]
				});
			} else {
				// 如果好友列表已存在，则只添加新好友    
				friendList.friends.push({
					friendId: friendId,
					username: username
				});
			}

			const result = await friendList.save();
			return new DataRls(
				result ? "好友添加成功" : "好友添加失败",
				result, // 返回信息    
				Boolean(result) // 添加结果    
			);
		}
	} catch (error) {
		throw error
	}
}

// 创建好友列表  
async function createFriendList(ownerId) {
	try {
		// 检查ownerId是否已经存在好友列表    
		let friendList = await Friend.findOne({
			ownerId: ownerId
		});
		if (!friendList) {
			// 如果不存在，则创建新的好友列表    
			friendList = new Friend({
				ownerId: ownerId,
				friends: []
			});
			await friendList.save();
		}
		return new DataRls(
			friendList ? "好友列表创建成功" : "好友列表创建失败",
			friendList, // 返回信息    
			Boolean(friendList) // 添加结果    
		);
	} catch (error) {
		throw error;
	}
}

// 异步函数获取指定id的所有好友信息
async function getFriendsById(findID) {
	try {
		// 使用mongoose查询数据库
		const friendData = await Friend.findById(findID);

		// 检查查询结果    
		if (!friendData) {
			// 如果没有找到对应的数据，返回一个包含错误信息的DataRls对象    
			return new DataRls('未找到指定用户的好友列表', '用户ID不存在或好友列表为空', false);
		}

		// 如果查询成功，封装数据并返回    
		return new DataRls('成功获取好友列表', friendData, true);
	} catch (error) {
		// 处理查询过程中出现的任何错误    
		console.error('获取好友列表时发生错误:', error);
		throw new DataRls('获取好友列表失败', null, false, error);
	}
}


// 根据好友数据库id，获取指定的用户的好友id列表
async function getFriendIdsByEmailId(emailId) {
	try {
		const friendData = await Friend.findById(emailId);
		if (!friendData) {
			return new DataRls('未找到指定邮箱_id的用户', '邮箱_id不存在或用户数据为空', false);
		}
		const friendIds = friendData.friends.map(friend => friend.friendId);
		return new DataRls('成功获取好友列表中的friendId字段', friendIds, true);
	} catch (error) {
		console.error('根据好友_id获取好友列表中的friendId字段时发生错误:', error);
		throw new DataRls('根据好友_id获取好友列表失败', null, false, error);
	}
};


module.exports = {
	Friend,
	addToFriendList,
	createFriendList,
	getFriendsById,
	getFriendIdsByEmailId
};